Ruby 日記 37日目: オーバーライドとsuperメソッド
次のコードを実行するとどうなりますか
code:gold/ex37/main.rb
class S
def initialize
puts "S#initialize"
end
end
class C < S
def initialize(*args)
super
puts "C#initialize"
end
end
C.new(1,2,3,4,5)
選択肢:
code:sh
C#initialize
code:sh
C#initialize
S#initialize
code:sh
S#initialize
C#initialize
エラーになる
解説:
継承したクラスのinitializeメソッドの中でsuperすると、そのinitializeメソッドの引数がそのまま親クラスのinitializeメソッドに渡される仕様だった気がする。のでエラーになりそう?
たぶん super() と書けば大丈夫、とかだったと思う。調べるぞ〜。
super は現在のメソッドがオーバーライドしているメソッドを呼び出し ます。
括弧と引数が省略された場合には現在のメソッドの引数がそのまま引き 渡されます。
ふむふむ
引数を渡さずにオーバーライドしたメソッドを呼び出すには super() と括弧を明示します。
だよね、あってた〜。
code:sh
# ruby gold/ex37/main.rb
gold/ex37/main.rb:2:in `initialize': wrong number of arguments (5 for 0) (ArgumentError)
from gold/ex37/main.rb:9:in `initialize'
from gold/ex37/main.rb:14:in `new'
from gold/ex37/main.rb:14:in `<main>'
正解は「エラーになる」だね
/icons/hr.icon
superじゃなくてsuper()を使った場合は?
code:gold/ex37/sample.rb
class S
def initialize
puts "S#initialize"
end
end
class C < S
def initialize(*args)
super()
puts "C#initialize"
end
end
C.new(1,2,3,4,5)
super() , puts "C#initialize" の順で呼び出しているからこうなるね
code:sh
# ruby gold/ex37/sample.rb
S#initialize
C#initialize